package com.agencia.persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import com.agencia.dominio.Terminal;
import com.agencia.dominio.Usuario;
import com.agencia.dominio.Venta;
import com.agencia.persistencia.*;

public class PersistenciaImp implements IPersistencia {
	
	private PersistenciaImp(){};
	
	private static PersistenciaImp instancia = new PersistenciaImp();
	
	public static PersistenciaImp getInstance(){
		return instancia;
	}

	public boolean AltaVentaBD(Venta venta) throws SQLException //sdc 13/11/12
	{ 
		
		String sql_idVenta = "SELECT valor FROM Configuracion WHERE parametro='Id_Ventas' LIMIT 1";
		
		Double id_idVenta = (double) 1;
		
		PreparedStatement ps = null;
		PreparedStatement ps1 = null;
		Connection con = null;
		Statement stmt = null;
		ResultSet rs_idVenta = null;
		
		con = DBConn.DataSourceCon();
		con.setAutoCommit(false);
		
		try {
			stmt = con.createStatement();
			rs_idVenta =stmt.executeQuery(sql_idVenta);
			
			while(rs_idVenta.next()) {
				id_idVenta = Double.valueOf(rs_idVenta.getString("valor")); //.valueOf(rs_idTerminal.getString("valor"));
			}
			
			id_idVenta +=1;
			
			String sql_addventa = "INSERT INTO Ventas (Id_Ticket, Id_Ticket_IMM, Matricula, FechaVenta,FechaInicio,Minutos,Importe,Id_Terminal,Id_Usuario) VALUES(?, ?, ?,?,?, ?, ?, ?,?)";
			String sql_increidventa = "UPDATE configuracion SET valor =" + id_idVenta.toString() + " WHERE parametro='"+Constants.getIdVentas()+"'";
			
			ps = con.prepareStatement(sql_addventa);
			ps1 = con.prepareStatement(sql_increidventa);
				
			SimpleDateFormat formatd = new SimpleDateFormat("yyyy-MM-dd");
			
			ps.setDouble(1, id_idVenta);         
			ps.setDouble(2, venta.getId_imm());
			ps.setString(3, venta.getMatricula());			
			ps.setString(4,formatd.format(venta.getFechaVenta()));
			ps.setString(5,formatd.format(venta.getFechaInicio()));
			ps.setInt(6, venta.getMinutos());
			ps.setDouble(7, venta.getImporte());
			ps.setDouble(8, venta.getId_terminal());
			ps.setDouble(9, venta.getId_usuario());
			ps = con.prepareStatement(sql_addventa);
			
			
			ps.executeUpdate();
			ps1.executeUpdate();
			con.commit();
			return true;
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		
					
		}finally {
			if(rs_idVenta != null) rs_idVenta.close();
			if(stmt != null) stmt.close();
			con.setAutoCommit(true);
			if(con != null) con.close();
			
		}
		return false;

	

	}

	public boolean AnularVentaBD(Venta venta) {
		return false;
	}

	public boolean IngresarUsuarioBD(Usuario usuario) throws SQLException{ //sdc 12/11/12
		
			String sql_idUsuario = "SELECT valor FROM Configuracion WHERE parametro='Id_Usuarios' LIMIT 1";
			Double id_idUsuario = (double) 1;
			PreparedStatement ps = null;
			PreparedStatement ps1 = null;
			Connection con = null;
			Statement stmt = null;
			ResultSet rs_idUsuario = null;
			con = DBConn.DataSourceCon();
			con.setAutoCommit(false);
			
			try {
				stmt = con.createStatement();
				rs_idUsuario =stmt.executeQuery(sql_idUsuario);
				while(rs_idUsuario.next()) {
					id_idUsuario = Double.valueOf(rs_idUsuario.getString("valor"));
				}
				id_idUsuario +=1;
				String sql_addusuario = "INSERT INTO Usuarios (id, nombre, usuario, password) VALUES(?, ?, ?, ?)";
				String sql_increidusuario = "UPDATE configuracion SET valor =" + id_idUsuario.toString() + " WHERE parametro='"+Constants.getIdUsuarios()+"'";
				
				ps = con.prepareStatement(sql_addusuario);
				ps1 = con.prepareStatement(sql_increidusuario);
				
				ps.setDouble(1, id_idUsuario);         
				ps.setString(2, usuario.getNombre());
				ps.setString(3, usuario.getUsuario());
				ps.setString(4, usuario.getPass());
				ps.executeUpdate();
				ps1.executeUpdate();
				con.commit();
				return true;
				
			} catch (Exception e) {
				System.out.println(e.getMessage());
				return false;
						
			}finally {
				if(rs_idUsuario != null) rs_idUsuario.close();
				if(stmt != null) stmt.close();
				con.setAutoCommit(true);
				if(con != null) con.close();
				
			}
	
		
	
		
	}

	public boolean ModificarUsuarioBD(Usuario usuario) {
		return false;
	}
	
	
	public boolean IngresarTerminalaBD(Terminal terminal) throws TerminalExisteException, TerminalErrorDatosException, SQLException {
		// TODO Auto-generated method stub
		
		if(terminal == null){
			
		}else if(terminal.getDomicilio().equalsIgnoreCase("") || terminal.getNombre().equalsIgnoreCase("") || terminal.getTelefono().equalsIgnoreCase("")){
			throw new TerminalErrorDatosException();
		}else{
			if(BuscarTerminalaBD(terminal)){
				throw new TerminalExisteException();
			}
			//String sql_idTerminal = "SELECT valor FROM Configuracion WHERE parametro='"+ Constants.getIdTerminal()+"' LIMIT 1";
			
			String sql_idTerminal = "SELECT valor FROM Configuracion WHERE parametro='Id_Terminales' LIMIT 1";
			
			Double id_idTerminal = (double) 1;
			
			PreparedStatement ps = null;
			PreparedStatement ps1 = null;
			Connection con = null;
			Statement stmt = null;
			ResultSet rs_idTerminal = null;
			
			con = DBConn.DataSourceCon();
			con.setAutoCommit(false);
			
			try {
				stmt = con.createStatement();
				rs_idTerminal = stmt.executeQuery(sql_idTerminal);
				
				while(rs_idTerminal.next()) {
					id_idTerminal = Double.valueOf(rs_idTerminal.getString("valor")); //.valueOf(rs_idTerminal.getString("valor"));
				}
				id_idTerminal +=1;
				
				String sql_addterminal = "INSERT INTO Terminales (id, nombre, domicilio, telefono) VALUES(?, ?, ?, ?)";
				String sql_increidterminal = "UPDATE configuracion SET valor =" + id_idTerminal.toString() + " WHERE parametro='"+Constants.getIdTerminal()+"'";
				
			
				ps1 = con.prepareStatement(sql_increidterminal);
				ps = con.prepareStatement(sql_addterminal);
				ps.setDouble(1, id_idTerminal);            //(id_idTerminal, 1000);
				ps.setString(2, terminal.getNombre());
				ps.setString(3, terminal.getDomicilio());
				ps.setString(4, terminal.getTelefono());
				ps1.executeUpdate();
				
				ps.executeUpdate();
				
				
						
				con.commit();
				return true;
				
			} catch (Exception e) {
				//FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(),""));
				System.out.println(e.getMessage());
				return false;
						
			}finally {
				if(rs_idTerminal != null) rs_idTerminal.close();
				if(stmt != null) stmt.close();
				con.setAutoCommit(true);
				if(con != null) con.close();
				
			}
		}
		return false;
	}

	public boolean ModificarTerminalBD(Terminal terminal) {
		return false;
	}

	public boolean ExisteUsuarioTerminalBD(String us, String pass,int id_terminal) throws SQLException {
		
		String sql_ExisteUsrTer = "SELECT COUNT(Usuarios.Id) AS Cantidad "; 
		sql_ExisteUsrTer += " FROM Usuarios JOIN Usuario_Terminal ON Usuario_Terminal.Id_Usuario = Usuarios.Id ";
		sql_ExisteUsrTer += " WHERE Usuarios.Usuario = ? AND Usuarios.Password = MD5(?) AND Usuario_Terminal.Id_Terminal = ?";
		
		PreparedStatement sql_statement = null;
		Connection con = null;
		ResultSet rs_eUser = null;
		Integer count = 0;
		
		con = DBConn.DataSourceCon();

			sql_statement = con.prepareStatement(sql_ExisteUsrTer);
			sql_statement.setString(1, us); 
			sql_statement.setString(2, pass);
			sql_statement.setInt(3, id_terminal);
			
			rs_eUser = sql_statement.executeQuery();
			rs_eUser.next();
			
			count = rs_eUser.getInt("Cantidad");
			rs_eUser.close();
			
			if(count!=0){
				return true;
			}else{
				return false;
			}
			
			
				

	}

	
	public boolean BuscarTerminalaBD(Terminal terminal) {
		return false;
	}

	public boolean LoginAdminBD(String us, String pass) {
		return false;
	}
	
	public ArrayList<Terminal> SelectAll() throws SQLException{
		
		ArrayList<Terminal> terminales = new ArrayList<Terminal>();
		String sql_ideditorial = "SELECT Nombre, Domicilio, Telefono FROM terminales";
		
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		
		con = DBConn.DataSourceCon();
		con.setAutoCommit(false);
		try {
			
			stmt = con.createStatement();
			rs = stmt.executeQuery(sql_ideditorial);
			
			Terminal t = new Terminal(null, sql_ideditorial, sql_ideditorial, sql_ideditorial);
			
			while (rs.next()){
	            t.setNombre(rs.getString("Nombre"));
	            t.setDomicilio(rs.getString("Domicilio"));
	            t.setTelefono(rs.getString("Telefono"));
	            
	            terminales.add(t);
			}
			
			con.commit();
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(rs != null) rs.close();
			if(stmt != null) stmt.close();
			con.setAutoCommit(true);
			if(con != null) con.close();
			
		}
		
		
		
		return terminales;
		
	}

	public Usuario ObtenerUsuario(String user) throws SQLException {
		
		
		String sql_ExisteUsrTer = "SELECT Usuarios.Id AS id, Usuarios.nombre AS nombre "; 
		sql_ExisteUsrTer += " FROM Usuarios";
		sql_ExisteUsrTer += " WHERE Usuarios.Usuario =?";
		
		PreparedStatement sql_statement = null;
		Connection con = null;
		ResultSet rs_eUser = null;
		Double id = (double) 0;
		String nombre;
		con = DBConn.DataSourceCon();

	
		
			sql_statement = con.prepareStatement(sql_ExisteUsrTer);
			sql_statement.setString(1, user);            
			
			rs_eUser = sql_statement.executeQuery();
			id = (double) rs_eUser.getInt("id");
			nombre= rs_eUser.getString("nombre");
			
			rs_eUser.close();
			Usuario retorno = new Usuario(id, nombre, user, "");
			return retorno;
	}
}
